public class Solution01 {

	public int[][] generateMatrix(int n) {
		int[][] arr = new int[n][n];

		// 循环模拟次数
		int loop = n / 2;

		// 每次循环的起始位置
		int startX = 0;
		int startY = 0;
		// 控制模拟一圈时，控制上侧和右侧遍历的长度
		int offset = 1;
		int value = 1;

		while (loop > 0) {
			int i = startX;
			int j = startY;

			// 上侧：从左到右，左闭右开的遍历填充
			// 左边右开的意思是：起点闭合，终点打开
			for (; j < startY + n - offset; ++j) {
				arr[i][j] = value++;
			}

			// 右侧：从上到下，左闭右开的遍历填充
			for (; i < startX + n - offset; ++i) {
				arr[i][j] = value++;
			}

			// 下侧：从右到左，左闭右开的遍历填充
			for (; j > startY; j--) {
				arr[i][j] = value++;
			}

			// 左侧：从下到上，左闭右开的遍历填充
			for (; i > startX; i--) {
				arr[i][j] = value++;
			}

			startX++;
			startY++;
			// 由于startX和startY每次循环一圈都要自增1，并且右边界和下边界每次循环一圈都要自减1，因此offset每次都加2
			offset += 2;
			loop--;
		}

		// n为奇数
		if (n % 2 == 1) {
			int mid = n / 2;
			arr[mid][mid] = value;
		}

		return arr;
	}
}
